# 通过类的实例操作数据库
# 1.连接数据库
# 2.创建游标
# 3.执行查询/修改
# 4.关闭

import pymysql
class DB(object):
    def __init__(self,curtype='tuple',**kwargs):
        self.__db_info={'host':'localhost','port':3306,'user':'root','password':'','charset':'utf8','db':'woniusales'}
        self.__db_info.update(kwargs)
        self.__curtype=curtype
        # 能连接默认数据库
        # 创建游标
        #

    def connect(self):
        self.__cnn=pymysql.connect(**self.__db_info)
        if self.__curtype == 'tuple':
            self.__cur=self.__cnn.cursor()
        elif self.__curtype == 'dict':
            self.__cur=self.__cnn.cursor(pymysql.cursors.DictCursor)
        else:
            raise Exception('传入的curtype参数错误')


    def update(self,sql):
        """修改数据"""
        # 更新了几条？如果更新0条，提示语句可能有问题
        # 不要忘记事务
        # self.__cur.execute(sql)
        # self.__cnn.commit()

    def query(self,sql,sql_args=None):
        """修改数据"""
        # 返回结果 【可以是列表，列名】
        # rows = self.__cur.execute(sql,sql_args)  # 执行sql，获取数据
        # data = self.__cur.fetchall()
        # fields = [i[0] for i in self.__cur.description]  # 列名
        # return rows, fields, data

        rows=self.__cur.execute(sql,sql_args)
        data=self.__cur.fetchall()
        fields = [i[0] for i in self.__cur.description]
        return rows,fields,data

    def __del__(self):
        """关闭游标"""
        self.__cur.close()
        self.__cnn.close()

if __name__ == '__main__':
    woniusales=DB(cursortype="dict")
    users=woniusales.query("select * from user ")
    print("用户有--->",users)

    # result=woniusales.update("update user set realname='管理员' where userid=5")
    # print("结果-->",result)






















# # 操作数据库的类
# import pymysql
#
# class DB(object):
#
#     def __init__(self,cursortype="tuple",**kwargs):
#         """
#         :param host: 数据库地址
#         :param port: 数据库端口号
#         :param user: 数据用户名
#         :param password: 数据库密码
#         :param charset: 操作字符集
#         :param database: 指定数据库名
#         :param cursortype: 游标类型，默认是dict-->字典，如果为tuple-->返回结果是元祖
#         :param kwargs: 连接数据库的额外参数
#         """
#
#         self.__db_info={"host":"localhost","port":3306,"user":"root","password":'',"charset":"utf8","database":"woniusales"}
#         self.__db_info.update(kwargs) # 补充其他参数
#         self.__cursortype=cursortype
#         self.__connect()
#
#         # 能连接默认数据
#         # 创建游标
#     def __connect(self):
#         self.__cnn=pymysql.connect(**self.__db_info)
#         if self.__cursortype=="dict":
#             self.__cur = self.__cnn.cursor(pymysql.cursors.DictCursor)
#         elif self.__cursortype=="tuple":
#             self.__cur=self.__cnn.cursor()
#         else:
#             # 报错？如果报错？
#             raise Exception("传入的cursortype参数错误！")
#
#     def update(self,sql,sql_args=None):
#         """
#         修改数据
#         :param sql: sql语句
#         :param sql_args: sql语句的参数
#         :return: 返回受印象的行数 （整数）
#         """
#
#         self.__cnn.begin()  #开启事务
#         rows = self.__cur.execute(sql, sql_args)  # 执行sql，获取数据
#         if rows<1:
#             print(f"Warnning: 受印象的行数是0，可能你的sql语句有错误。( {sql} )")
#         self.__cnn.commit()   #提交事务
#         return rows
#
#     def query(self,sql,sql_args=None):
#         """
#         :param sql:  查询语句
#         :param sql_args:  查询语句的参数
#         :return: 返回 （行数，列名，数据）
#         """
#         # 返回结果 【可以是列表（不要忘记高速我列名是什么），或  字典】
#
#         rows=self.__cur.execute(sql, sql_args)  # 执行sql，获取数据
#         data=self.__cur.fetchall()
#         fields=[ i[0] for i in self.__cur.description]               # 列名
#         return rows,fields,data
#
#     def __del__(self):
#         """关闭游标，关闭连接"""
#         self.__cur.close()
#         self.__cnn.close()
#
#
# woniusales=DB(cursortype="dict")
# users=woniusales.query("select * from user ")
# print("用户有--->",users)
#
# # result=woniusales.update("update user set realname='管理员' where userid=5")
# # print("结果-->",result)



